﻿import threading
import time
import bgtp
from platform.utilits import MSG_BODY

class TimeOut(threading.Thread):

	"""
	TimeOut подписывает с определенным фильтром свою очередь и раз в timetic секунд проверяет ее - 
	если фильтр прошло хоть одно событие, то тайаут обнуляется, очередь чиститься, в противном случае
	таймаут копиться, пока не превысит значение timemax, тогда генерируется сообщение с темой msg_header
	которую может обработать например игровой сервер

	примерное использование:
		to = timeout.TimeOut(0.01, 1.5, {MSG_USR: "User1"}, {MSG_TYPE: "timeout", MSG_USR: "User1"})
		to.start()
	тогда в течении 1.5 секунд от пользователя User1 не придет ни одного сообщения, то от его имени будет 
	сгенерировано событие "timeout"
	"""
	
	def __init__(this, timetic, timemax, filter, msg_header):
		threading.Thread.__init__(this)
		this.timetic = timetic
		this.timemax = timemax
		this.filter = filter
		this.msg = msg_header
		this.do = True
		this.stream = []
		bgtp.liba.subscribe(this.filter, this.stream)
		this.setDaemon(True)
	
	def run(this):
		curtime = 0
		while this.do:
			if len(this.stream) > 0:
				curtime = 0
				while len(this.stream) > 0:
					this.stream.pop()
			elif curtime >= this.timemax:
				bgtp.liba.mail(this.msg)
				this.stop()
				break
			time.sleep(this.timetic)
			curtime += this.timetic
	
	def stop(this):
		#liba.unsubscribe(filter, this.stream) #todo
		this.do = False
